package com.skycan.plc.adapter.protocol;

import com.skycan.plc.adapter.model.ControlCommand;
import com.skycan.plc.adapter.model.DataPoint;
import com.skycan.plc.adapter.model.DeviceInfo;

import java.util.List;

/**
 * 协议适配器接口
 */
public interface ProtocolAdapter {

    /**
     * 连接设备
     * 
     * @param deviceInfo 设备信息
     * @return 是否连接成功
     */
    boolean connect(DeviceInfo deviceInfo);

    /**
     * 断开连接
     * 
     * @param deviceInfo 设备信息
     */
    void disconnect(DeviceInfo deviceInfo);

    /**
     * 读取数据点
     * 
     * @param deviceInfo 设备信息
     * @param address    地址
     * @param type       数据类型
     * @return 数据点
     */
    DataPoint readDataPoint(DeviceInfo deviceInfo, String address, DataPoint.DataType type);

    /**
     * 批量读取数据点
     * 
     * @param deviceInfo 设备信息
     * @param addresses  地址列表
     * @param types      类型列表
     * @return 数据点列表
     */
    List<DataPoint> readDataPoints(DeviceInfo deviceInfo, List<String> addresses, List<DataPoint.DataType> types);

    /**
     * 写入数据点
     * 
     * @param deviceInfo 设备信息
     * @param command    控制命令
     * @return 是否写入成功
     */
    boolean writeDataPoint(DeviceInfo deviceInfo, ControlCommand command);

    /**
     * 检查设备是否在线
     * 
     * @param deviceInfo 设备信息
     * @return 是否在线
     */
    boolean isDeviceOnline(DeviceInfo deviceInfo);
}